package com.zlk.algorithm.huawei.nowcoder.match;



import java.io.*;
import java.util.HashMap;
import java.util.Scanner;
import java.util.regex.Pattern;

/**
 * @program: algorithm
 * @ClassName H20
 * @description: 正则+找重复字串
 * @author: slfang
 * @create: 2024-12-20 17:39
 * @Version 1.0
 **/
public class H20 {

    //1、长度大于8
    //2、大写字母/小写字母/数字/其它符号，以上四种至少三种
    //3、不能分割出两个相等的长度大于 2 的子串，例如 abcabc 可以分割出两个 abc，不合法，ababa 则无法分割出2个aba。
    //注：其他符号不含空格或换行

    //字符串输入尽量别用StreamTokenizer

    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String val =  in.nextLine();
            if(val.length()<=8){
                System.out.println("NG");
                continue;
            }
            //2、大写字母/小写字母/数字/其它符号，以上四种至少三种
            if(!getMatch(val)){
                System.out.println("NG");
                continue;
            }
            //不能分割出两个相等的长度大于 2 的子串，例如 abcabc 可以分割出两个 abc，不合法，ababa 则无法分割出2个aba。
            //2、大写字母/小写字母/数字/其它符号，以上四种至少三种
            if(!validationRepeat(val)){
                System.out.println("NG");
                continue;
            }
            System.out.println("OK");
        }

    }

    private static boolean validationRepeat(String val) {
        int len = val.length();
        HashMap<String,Integer> validationMap = new HashMap<>();
        if(val.length()>=4){
            int l=0;
            while (l<=val.length()-3){
                String cur = val.substring(l,l+3);
                Integer intVal = validationMap.get(cur);
                if(intVal==null||intVal.intValue()!=0){
                    validationMap.put(cur,0);
                }else{
                    return false;
                }
                l++;
            }
        }
        return true;
    }

    // 校验是否有重复子串
    // 滑动窗口，前面的字符是否包含后面的字符
    private static boolean getString(String str, int l, int r) {
        if (r >= str.length()) {
            return false;
        }
        if (str.substring(r).contains(str.substring(l, r))) {
            return true;
        } else {
            return getString(str,l+1,r+1);
        }
    }

    // 检查是否满足正则
    private static boolean getMatch(String str){
        int count = 0;
        Pattern p1 = Pattern.compile("[A-Z]");
        if(p1.matcher(str).find()){
            count++;
        }
        Pattern p2 = Pattern.compile("[a-z]");
        if(p2.matcher(str).find()){
            count++;
        }
        Pattern p3 = Pattern.compile("[0-9]");
        if(p3.matcher(str).find()){
            count++;
        }
        Pattern p4 = Pattern.compile("[^a-zA-Z0-9]");
        if(p4.matcher(str).find()){
            count++;
        }
        if(count >= 3){
            return true;
        }else{
            return false;
        }
    }

}
